package HLA2.control;

import hla.rti.RTIexception;

import HLA2.federate.Federate2;
import HLA2.generatori.*;
import HLA2.entity.*;


public class Simulatore2{

	public Federate2 simulazione;
	private static double mediaDisk1 = 0.0125;
	private static double mediaDisk2 = 0.05;
	public CentroServizio disk1;
	public CentroServizio disk2;

	public Simulatore2(Federate2 simulazione){
		this.simulazione = simulazione;
	}

	public void avvia() throws RTIexception{
		simulazione.advanceTime(1.0);
//		*********************************************************************
//		System.out.println("TEMPO FEDERAZIONE "+simulazione.fedamb.federateTime);
//		*********************************************************************
		disk1 = new CentroServizio(new GeneratoreKErlang(3,mediaDisk1, simulazione.fedamb.random));
//		System.out.println("SemeGen1 = "+disk1.gen.seme);
		simulazione.advanceTime(2.0);
//		*********************************************************************
//		System.out.println("TEMPO FEDERAZIONE "+simulazione.fedamb.federateTime);
//		*********************************************************************
		disk2 = new CentroServizio(new GeneratoreKErlang(2,mediaDisk2,simulazione.fedamb.random));
//		System.out.println("SemeGen2 = "+disk2.gen.seme);
		simulazione.advanceTime(1.0);
//		*********************************************************************
//		System.out.println("TEMPO FEDERAZIONE "+simulazione.fedamb.federateTime);
//		*********************************************************************

	}

	public void gestisciDischi() throws RTIexception
	{
		if (simulazione.fedamb.disk1 == true)
		{
//			*********************************************************************
//			System.out.println("simulazione.fedamb.disk1 uguale a true");
//			*********************************************************************
			if(!disk1.occupato){
				disk1.occupato = true;
				
                double x = disk1.getGen().next();
                simulazione.updateAttributeValues(simulazione.objectHandle, x, "tempoD1");
//				*********************************************************************
//    			System.out.println("Gestisci: mando tempo disk1 ");
//				*********************************************************************
				simulazione.advanceTime(1.0);
//				*********************************************************************
//				System.out.println("TEMPO FEDERAZIONE "+simulazione.fedamb.federateTime);
//				*********************************************************************
			}
			else{
//				*********************************************************************
//				System.out.println("Gestisci: aggiungo in coda disk1 il job "+simulazione.fedamb.job);
//				*********************************************************************
				simulazione.mandaJob(simulazione.objectHandle, "jobInCodaDISCO1", simulazione.fedamb.job);
				disk1.coda.add(simulazione.fedamb.job);

                simulazione.advanceTime(1.0);
			}

			simulazione.fedamb.disk1=false;
		}

		if (simulazione.fedamb.disk2==true)
		{
//			*********************************************************************
//			System.out.println("simulazione.fedamb.disk2 uguale a true");
//			*********************************************************************
			if(!disk2.occupato){
				disk2.occupato = true;
//				*********************************************************************
//				System.out.println("Gestisci: Mando tempo disk2");
//				*********************************************************************
				double x = disk2.getGen().next();
//                System.out.println("Valore disk2:  "+x);

                simulazione.updateAttributeValues(simulazione.objectHandle, x/*disk2.getGen().next()*/, "tempoD2");
				simulazione.advanceTime(1.0);
//				*********************************************************************
//				System.out.println("TEMPO FEDERAZIONE "+simulazione.fedamb.federateTime);
//				*********************************************************************
			}
			else{
//				*********************************************************************
//				System.out.println("Gestisci: aggiungo in coda Disk2 il job "+ simulazione.fedamb.job);
//				*********************************************************************
				simulazione.mandaJob(simulazione.objectHandle, "jobInCodaDISCO2", simulazione.fedamb.job);
				disk2.coda.add(simulazione.fedamb.job);

                simulazione.advanceTime(1.0);
			}
			simulazione.fedamb.disk2=false;
		}

		if (simulazione.fedamb.oss==true)
		{
//			*********************************************************************
//			System.out.println("Gestisci: OSSERVAZIONE");
//			*********************************************************************
			simulazione.updateAttributeValues(simulazione.objectHandle, disk1.coda.size(), "codaD1");
			simulazione.fedamb.oss=false;
		}

		if (simulazione.fedamb.gestisciD1==true)
		{
//			*********************************************************************
//			System.out.println("Gestisci: newFineDisk1 del job "+simulazione.fedamb.job);
//			*********************************************************************
			GestioneDischi fineDisk1 = new GestioneDischi(this);
			fineDisk1.gestisciDisk1(simulazione.fedamb.job);
			simulazione.fedamb.gestisciD1=false;
		}

		if (simulazione.fedamb.gestisciD2==true)
		{
//			*********************************************************************
//            System.out.println("Gestisci: newFineDisk2 del job "+simulazione.fedamb.job);
//			*********************************************************************
			GestioneDischi fineDisk2 = new GestioneDischi(this);
			fineDisk2.gestisciDisk2(simulazione.fedamb.job);
			simulazione.fedamb.gestisciD2=false;
		}
	}


}
